package templateMethodPattern;

public abstract class SwordsMan {

    //该方法标记为final, 防止算法框架被修改
    public final void fighting() {

        //运行内功, 抽象方法
        neiGong();

        //调整经脉,具体方法
        meridian();

        //是否有武器
        if (hasWeapons()){
            //使用武器, 抽象方法
            weapons();
        }

        //使用招式
        moves();

        //使用钩子方法
        hook();

    }


    //抽象方法, 子类必须实现
    protected abstract void neiGong();

    protected abstract void weapons();

    protected abstract void moves();

    protected void meridian(){
        System.out.println("Use  meridian ...");
    }


    protected void hook() {
    }

    /**
     * 是否有武器
     * @return
     */
    protected boolean hasWeapons(){
        return true;
    }
}
